export default class MouseMoveObserver {
    container = null;
    d3Instance = null;
    
    constructor() {
        // 存储所有观察者回调函数
        this.observers = [];
        // 标记是否已绑定全局鼠标移动事件
        this.isListening = false;
    }

    init = (d3Instance, container) => {
        this.d3Instance = d3Instance;
        this.container = container;
    }
  
    // 注册观察者
    subscribe(callback) {
      // 确保回调是函数
      if (typeof callback !== 'function') {
        throw new Error('回调必须是一个函数');
      }
      
      // 添加到观察者列表
      this.observers.push(callback);
      
      // 如果还没有监听鼠标移动事件，则绑定
      if (!this.isListening) {
        this.startListening();
      }
      
      // 返回一个取消订阅的函数
      return () => this.unsubscribe(callback);
    }
  
    // 移除观察者
    unsubscribe(callback) {
      this.observers = this.observers.filter(observer => observer !== callback);
      
      // 如果没有观察者了，取消全局事件监听
      if (this.observers.length === 0 && this.isListening) {
        this.stopListening();
      }
    }
  
    // 开始监听全局鼠标移动
    startListening() {
      this.handleMouseMove = (...rest) => {
        // 触发所有观察者
        this.observers.forEach(callback => {
          // 传递鼠标位置信息
          callback(...rest);
        });
      };
      
      this.container.on('mousemove', this.handleMouseMove);
      this.isListening = true;
    }
  
    // 停止监听全局鼠标移动
    stopListening() {
      this.container.remove('mousemove', this.handleMouseMove);
      this.isListening = false;
      this.handleMouseMove = null;
    }
  
    // 清除所有观察者
    clear() {
      this.observers = [];
      this.stopListening();
    }
}